home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / osrc.arc / ARPCMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-28  |  4.1 KB  |  190 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9.  
  10. extern char Badhost[];
  11. extern char Nospace[];
  12. extern struct arp_stat Arp_stat;
  13. extern char *Arptypes[];
  14. int32 resolve();
  15. void arp_drop();
  16. char *inet_ntoa();
  17. static int doarpadd(),doarpdrop();
  18. static void dumparp();
  19.  
  20. struct cmds Arpcmds[] = {
  21.     "add", doarpadd, 0, 4,
  22.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  23.  
  24.     "drop", doarpdrop, 0, 3,
  25.     "arp drop <hostid> ether|ax25|netrom",
  26.  
  27.     "publish", doarpadd, 0, 4,
  28.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  29.  
  30.     NULLCHAR, NULLFP, 0, 0,
  31.     "arp subcommands: add, drop, publish",
  32. };
  33. char *Arptypes[] = {
  34.     "NET/ROM",
  35.     "10 Mb Ethernet",
  36.     "3 Mb Ethernet",
  37.     "AX.25",
  38.     "Pronet",
  39.     "Chaos",
  40.     "Arcnet",
  41.     "Appletalk"
  42. };
  43.  
  44. int
  45. doarp(argc,argv,envp)
  46. int argc;
  47. char *argv[];
  48. void *envp;
  49. {
  50.     if(argc < 2){
  51.         dumparp();
  52.         return 0;
  53.     }
  54.     return subcmd(Arpcmds,argc,argv,envp);
  55. }
  56. static
  57. doarpadd(argc,argv)
  58. int argc;
  59. char *argv[];
  60. {
  61.     int16 hardware;
  62.     int32 addr;
  63.     char *hwaddr;
  64.     struct arp_tab *ap;
  65.     struct arp_type *at;
  66.     int pub = 0;
  67.  
  68.     if(argv[0][0] == 'p')    /* Is this entry published? */
  69.         pub = 1;
  70.     if((addr = resolve(argv[1])) == 0){
  71.         printf(Badhost,argv[1]);
  72.         return 1;
  73.     }
  74.     /* This is a kludge. It really ought to be table driven */
  75.     switch(tolower(argv[2][0])){
  76.     case 'n':    /* Net/Rom pseudo-type */
  77.         hardware = ARP_NETROM;
  78.         break;
  79.     case 'e':    /* "ether" */
  80.         hardware = ARP_ETHER;
  81.         break;        
  82.     case 'a':    /* "ax25" */
  83.         hardware = ARP_AX25;
  84.         break;
  85.     case 'm':    /* "mac appletalk" */
  86.         hardware = ARP_APPLETALK;
  87.         break;
  88.     default:
  89.         printf("unknown hardware type \"%s\"\n",argv[2]);
  90.         return -1;
  91.     }
  92.     /* If an entry already exists, clear it */
  93.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  94.         arp_drop(ap);
  95.  
  96.     at = &Arp_type[hardware];
  97.     if(at->scan == NULLFP){
  98.         printf("Attach device first\n");
  99.         return 1;
  100.     }
  101.     /* Allocate buffer for hardware address and fill with remaining args */
  102.     if((hwaddr = malloc(at->hwalen)) == NULLCHAR){
  103.         printf(Nospace);
  104.         return 0;
  105.     }
  106.     /* Destination address */
  107.     (*at->scan)(hwaddr,&argv[3],1);
  108.     ap = arp_add(addr,hardware,hwaddr,at->hwalen,pub);    /* Put in table */
  109.     free(hwaddr);                    /* Clean up */
  110.     stop_timer(&ap->timer);            /* Make entry permanent */
  111.     ap->timer.count = ap->timer.start = 0;
  112.     return 0;
  113. }
  114. /* Remove an ARP entry */
  115. static
  116. doarpdrop(argc,argv)
  117. int argc;
  118. char *argv[];
  119. {
  120.     int16 hardware;
  121.     int32 addr;
  122.     struct arp_tab *ap;
  123.  
  124.     if((addr = resolve(argv[1])) == 0){
  125.         printf(Badhost,argv[1]);
  126.         return 1;
  127.     }
  128.     /* This is a kludge. It really ought to be table driven */
  129.     switch(tolower(argv[2][0])){
  130.     case 'n':
  131.         hardware = ARP_NETROM;
  132.         break;
  133.     case 'e':    /* "ether" */
  134.         hardware = ARP_ETHER;
  135.         break;        
  136.     case 'a':    /* "ax25" */
  137.         hardware = ARP_AX25;
  138.         break;
  139.     case 'm':    /* "mac appletalk" */
  140.         hardware = ARP_APPLETALK;
  141.         break;
  142.     default:
  143.         hardware = 0;
  144.         break;
  145.     }
  146.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  147.         return -1;
  148.     arp_drop(ap);
  149.     return 0;    
  150. }
  151. /* Dump ARP table */
  152. static void
  153. dumparp()
  154. {
  155.     register int i;
  156.     register struct arp_tab *ap;
  157.     char e[128];
  158.  
  159.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  160.      Arp_stat.recv,Arp_stat.badtype,Arp_stat.badaddr,Arp_stat.inreq,
  161.      Arp_stat.replies,Arp_stat.outreq);
  162.  
  163.     printf("IP addr         Type           Time Q Addr\n");
  164.     for(i=0;i<ARPSIZE;i++){
  165.         for(ap = Arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  166.             printf("%-16s",inet_ntoa(ap->ip_addr));
  167.             printf("%-15s",Arptypes[ap->hardware]);
  168.             printf("%-5ld",read_timer(&ap->timer)*(long)MSPTICK/1000);
  169.             if(ap->state == ARP_PENDING)
  170.                 printf("%-2u",len_q(ap->pending));
  171.             else
  172.                 printf("  ");
  173.             if(ap->state == ARP_VALID){
  174.                 if(Arp_type[ap->hardware].format != NULLFP){
  175.                     (*Arp_type[ap->hardware].format)(e,ap->hw_addr);
  176.                 } else {
  177.                     e[0] = '\0';
  178.                 }
  179.                 printf("%s",e);
  180.             } else {
  181.                 printf("[unknown]");
  182.             }
  183.             if(ap->pub)
  184.                 printf(" (published)");
  185.             printf("\n");
  186.         }
  187.     }
  188.     return;
  189. }
  190.